<?php
/*
 * * * * * * * * * * LICENCIA * * * * * * * * * * * * * * * * * * * * *

Copyright(C) 2012
Instituto Universtiario de Tecnología Dr. Federico Rivero Palacio

Este programa es Software Libre y usted puede redistribuirlo y/o modificarlo
bajo los términos de la versión 3.0 de la Licencia Pública General (GPLv3)
publicada por la Free Software Foundation (FSF), es distribuido sin ninguna
garantía. Usted debe haber recibido una copia de la GPLv3 junto con este
programa, sino, puede encontrarlo en la página web de la FSF, 
específicamente en la dirección http://www.gnu.org/licenses/gpl-3.0.html

 * * * * * * * * * * ARCHIVO * * * * * * * * * * * * * * * * * * * * *

Nombre: EstudianteControlador.clase.php
Diseñador: 
Programador: Yuri Lazo
Fecha: Diciembre de 2012
Descripción:  
	Este es el controlador del módulo Estudiante, permite manejar las 
	operaciones relacionadas con los estudiantes (agregar, modificar,
	eliminar, consultar, buscar), es el intermediario entre la base de
	datos y la vista. 
	
	En el constructor se establecen las configuraciones iniciales y en 
	la función manejarRequerimiento se maneja la accion a emprender, 
	obteniéndola del arreglo Post/Get en la posición 'accion'


 * * * * * * * * Cambios/Mejoras/Correcciones/Revisiones * * * * * * * *
Diseñador - Programador /   Fecha   / Descripción del cambio
---                         ----      ---------

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/

//Objeto Estudiante
require_once "negocio/Estudiante.clase.php";
//Clase que permite la comunicación con la base de datos
require_once "modulos/estudiante/modelo/EstudianteServicio.clase.php";
//objeto fotografias
  //  ****** controlador del módulo Fotografia  ******
require_once "negocio/Fotografia.clase.php";

require_once "modulos/fotografia/modelo/FotografiaServicio.clase.php";

//Clase que permite la comunicación con la base de datos del modulo Curso
//require_once "Modulos/Curso/Modelo/CursoServicio.clase.php";

//Clase que permite reutilizar la comunicación de la clase persona con la base de datos 
require_once "modulos/persona/modelo/PersonaServicio.clase.php";



require_once "modulos/instituto/modelo/InstitutoServicio.clase.php";
//Clase que permite obtener meterias 
//require_once "Modulos/Curso/Modelo/CursoServicio.clase.php";


class EstudianteControlador{
	private $subControlador;
	

	public static function iniciar(){
		self::configurar();
		self::manejarRequerimiento();
	}


	private static function configurar(){
		global $gbVista;
		
		//permite colocar el tipo de vista que se está manejando en la 
		//petición
		if ($gbVista->obtenerFormato() == "html5")
			$gbVista->agregarJavascript("modulos/estudiante/vista/html5/Estudiante.js");
			$gbVista->agregarCSS("modulos/estudiante/vista/html5/Css/mostrarFoto.css");
			$gbVista->agregarCSS("modulos/estudiante/vista/html5/Css/MostrarModificar.css");	
			$gbVista->agregarJavascript("base/clases/vista/html5/Paginacion.js");


		 //se obtiene el sub modulo a trabajar del arreglo POST y/o GET
		$subModulo = PostGet::obtenerPostGet('submodulo');	
		//permite colocar un submodulo predefinido en caso de no colocarlo
		if(!$subModulo){
			$subModulo= 'fotografia';
		}
		
		//if ($subModulo=='fotografia'){	
		//	self::asignarSubControlador($subModulo, new FotografiaControlador());
		//}			
	}


	
	/*Método que permite manejar el requerimiento (o acción) indicado por
	 * el usuario según su petición
	 * resumen de acciones:
	 *  listar: muestra una lista de Estudiantes
		mostrar: muestra toda la información de un solo Estudiante
		preagregar: muestra el formulario para agregar un Estudiante
		agregar: recibe los datos de un Estudiante llenados en el formulario
		         llamado por 'preagregar' e intenta agregar el Estudiante
		         en la base de datos
		premodificar: carga en un formulario los datos de un Estudiante a
		         ser modificado
		modificar: envía al servidor los datos ya modificados de un 
		         Estudiante o en intenta hacer el cambio en la base de datos
		eliminar: intenta eliminar un Estudiante de la base de datos
		
		Cada acción será redireccionada a un método que la procesa para 
		mayor orden 
		
	 */
	public static function manejarRequerimiento(){
		//permite obtener la acción a realizar en este módulo

		$accion = (PostGet::obtenerPostGet('m_accion'));
		             

		//permite colocar una acción predefinida en caso de no colocarla
		if (!$accion)
			$accion = 'listar';

		if ($accion == 'mostrar'){
			self::mostrarEstudiante();
		}elseif ($accion == 'listar') {
			self::listarEstudiantes();
		}elseif ($accion == 'modificar'){
			self::modificarEstudiante();
		}elseif ($accion == 'premodificar'){
			self::premodificarEstudiante();
		}elseif ($accion == 'eliminar'){ 
			self::eliminarEstudiante();
		}elseif ($accion == 'preagregar') 
			self::preagregarEstudiante();
		elseif ($accion == 'agregar') 
			self::agregarEstudiante();
		else
			echo "Acci&oacute;n no v&aacute;lida en el m&oacute;dulo Estudiante: $accion";	
	}

	


	public static function validarDuplicaciones($estudiante){
		global $gbVista;
		/*ejecuta las validaciones en funciones apartes con el fin de 
		desechar información no necesaria en la memoria RAM del servidor*/
		
		//valida la anterior existencia de una cedula en la base de datos
		$cedula= self::validarCedula($estudiante->obtenerCedula(), $estudiante->obtenerCodigo());
		if ($cedula){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. La cedula '. $cedula .' ya existe');
			return true;
			}

		//valida la anterior existencia de una carnet en la base de datos
		$carnet= self::validarNumCarnet($estudiante->obtenerNumCarnet(), $estudiante->obtenerCodigo());
		if ($carnet){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. El carnet '. $carnet .'. ya existe');
			return true;
			}

		//valida la anterior existencia de una expediente en la base de datos
		$expediente= self::validarNumExpediente($estudiante->obtenerNumExpediente(), $estudiante->obtenerCodigo());
		if ($expediente){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. El expediente '. $expediente .'. ya existe');
			return true;
			}

		//valida la anterior existencia de un login en la base de datos
		$login= self::validarLogin($estudiante->obtenerLogin(), $estudiante->obtenerCodigo());
		if ($login){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. El login '. $login .'. ya existe');
			return true;
			}

		//valida la anterior existencia de un codRusnies en la base de datos
		$codRusnies= self::validarCodRusnies($estudiante->obtenerCodRusnies(), $estudiante->obtenerCodigo());
		if ($codRusnies){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. El codRusnies '. $codRusnies .'. ya existe');
			return true;
			}

		//valida la anterior existencia de un codRusnies en la base de datos
		$rif= self::validarRif($estudiante->obtenerRif(), $estudiante->obtenerCodigo());
		if ($rif){
			$gbVista->asignarDato('mensaje','No se puede registrar el estudiante. El rif '. $rif .'. ya existe');
			return true;
			}

		return false;
		
		}
	
	public static function listarEstudiantes(){
		//reconocer objeto global gbVista
		global $gbVista;
		//obtener el patrón de búsqueda		
		$patron = PostGet::obtenerPostGet('patron');
		
		$patron = ($patron) ? $patron : '';
		
		//obtener la lista de Estudiante según el patrón 
		$estudiantes = EstudianteServicio::obtenerListaEstudiantes($patron);

		$gbVista->asignarDato('estudiantes',$estudiantes);
		$gbVista->asignarDato('patron', $patron);
		$gbVista->asignarVista("EstudianteListar");		
		$gbVista->mostrar();

	}
	
	
	
	
	/* Médodo que permite mostar el formulario para agregar un Estudiante */
		public static function preagregarEstudiante() {
		//1. reconocer objeto global gbVista
		global $gbVista;

		//2. le asigna la información necesaria para manejar en la vista, en
		//  este caso la accion (preagregar) y un arreglo con un objeto
		// docente vacío

		
		$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));
		$gbVista->asignarDato('estudiante', new Estudiante());
		
		//3. Se asigna la dirección del archivo que mostrará la información de la vista 
		$gbVista->asignarVista("EstudianteAgregarModificar");
		
		
		//4. Muestra la vista por pantalla
		$gbVista->mostrar();
		
	}

	public static function agregarEstudiante() {
		global $gbVista;
		
		//construir el objeto estudiante sin el código ya que la base de datos
		//lo asigna automáticamente 
		$estudiante = new Estudiante();
		$estudiante = self::cargardeFormulario();
		
		
		/*si algún dato no dublicable del objeto ya existe en la base de datos
		devuelve true*/
		$error= self::validarDuplicaciones($estudiante);
		
		//asigna la información a la vista para comunicarse con el usuario
		$gbVista->asignarDato('estudiante', $estudiante);

		//titulo predeterminado para modificar
		$gbVista->asignarDato('titulo', 'Agregar Estudiante');
		
		if ($error==false){
			//procede a agregar el estudiante en la tabla persona
			$respuestaP = PersonaServicio::agregarPersona($estudiante);
			//si hubo éxito al agregar el objeto en la tabla persona $respuestaP obtiene como valor 'true'
			if ($respuestaP){
				//procede a agregar el objeto en la tabla estudiante
				$respuesta = EstudianteServicio::agregarEstudiante($estudiante);
			
				//ejecucion de el submodulo
				$subModulo = PostGet::obtenerPostGet('submodulo');
				$gbVista->asignarDato('accion',PostGet::obtenerPostGet('accion'));

				if ($respuesta === true) { //caso de éxito en la agregación
					//asigna como información un instituto vacío para mostrar de nuevo 
					//el formulario en blanco
					$fotografia= $this->obtenerSubControlador('fotografia')->manejarRequerimiento();
					
					//asigna el mensaje a mostrar
					$gbVista->asignarDato('mensaje','El estudiante ' . $estudiante->obtenerNombre1() .' ha sido agregado con éxito');
				}else{  //en caso de error

					//asigna el mensaje a mostrar según el error
					$gbVista->asignarDato('exito',false);
					//asigna el mismo estudiante como información para que permanezca
					//la información en pantalla
					$gbVista->asignarDato('mensaje','No se pudo agregar el estudiante '. $estudiante->obtenerNombre1() .'. (ha sido agregado solo en la tabla "persona")');
				}
			}else{
				
				
				//asigna el mensaje a mostrar según el error
				$gbVista->asignarDato('exito',false);
				//asigna el mismo estudiante como información para que permanezca
				//la información en pantalla
				$gbVista->asignarDato('mensaje','No se pudo agregar el estudiante '. $estudiante->obtenerNombre1() .'. error desconocido');

			}
		}else{
			//asigna el mensaje a mostrar según el error
			$gbVista->asignarDato('exito',false);
			//asigna el mismo estudiante como información para que permanezca
		}
		var_dump($estudiante->obtenerCodigo());
		$fotografia=new Fotografia();
		$fotografia->asignarCedula(			$estudiante->obtenerCedula()				);
		$fotografia->asignarCodigo(			$estudiante->obtenerCodigo()				);
		$fotografia->asignarImagen(			$_FILES ['imagen']			 				);
		$fotografia->asignarNombre( 		$_FILES ['imagen']['name']					);		
		$fotografia->asignarNombreTemporal( $_FILES ['imagen']['tmp_name']				);
		$fotografia->asignarTamaño(			$_FILES ['imagen']['size']					);
		$fotografia->asignarDireccion(		$_FILES ['imagen']['tmp_name']				);
		echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
		var_dump($fotografia);
		FotografiaServicio::agregarFotografia($fotografia);
		
		//asigna la vista que muestra la información
		$gbVista->asignarVista("EstudianteMensaje");
		
		//instruye a que se muestre la vista
		$gbVista->mostrar();
	}

	
	public static function mostrarEstudiante(){

		//1. reconocer objeto global gbVista
		global $gbVista;
		//se obtiene el codigo del docente a buscar en el arreglo POST y/o GET
		$codigo = PostGet::obtenerPostGet('codigo');
		//se obtiene el sub modulo a trabajar del arreglo POST y/o GET
		$submodulo = PostGet::obtenerPostGet('submodulo');
		//2. Buscar en base de datos
		$estudiante = EstudianteServicio::obtenerEstudiantePorCodigo($codigo);
		
		
		//se obtiene el sub modulo a trabajar del arreglo POST y/o GET
		
		//3. Mostrar en la vista
		if ($estudiante){
			//$fotografia= obtenerSubControlador('fotografia')->manejarRequerimiento();
			$gbVista->asignarDato('estudiante', $estudiante);
			$gbVista->asignarDato('mensaje', null);
			$gbVista->asignarDato('exito', true);
			
		}else{
			$gbVista->asignarDato('estudiante', null);
			$gbVista->asignarDato('mensaje', "Error al buscar el estudiante");
			$gbVista->asignarDato('exito', false);
		}
		$gbVista->asignarVista("EstudianteMostrar");
		$gbVista->mostrar();	
	}
	/* Permite cargar en pantalla la información de un estudiante para modificarlo,
	   recibe el código del estudiante, lo busca en la base de datos y luego
	   lo carga y muestra en la vista correspondiente
	*/
	public static function premodificarEstudiante(){
		global $gbVista;
		//obtiene el código del instituto		
		$codigo = PostGet::obtenerPostGet('codigo');
		
		//buscar el instituto en la base de datos, retorna false en caso
		//de error, de lo contrario retorna un arreglo con los institutos
		//en este caso un arreglo con sólo una posición
		$estudiante = EstudianteServicio::obtenerEstudiantePorCodigo($codigo);		
		//Si hubo error en la búsqueda llama a una página genérica para mostrar
		//errores
		

		if ($estudiante == false) { //hubo error en la búsqueda
			$gbVista->asignarDato('titulo', 'Error');
			$gbVista->asignarDato('mensaje','Estudiante no encontrado, no se puede hacer la modificación');
			$gbVista->asignarVista("EstudianteMensaje");

		// en caso de éxito carga la información en la vista correspondiente
		}else{ 
			//$fotografia= $this->obtenerSubControlador('fotografia')->manejarRequerimiento();
			$gbVista->asignarDato('estudiante', $estudiante);
			$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));
			$gbVista->asignarVista("EstudianteAgregarModificar");
		}	
		//muestra la vista previamente configurada
		$gbVista->mostrar();
	}
	/*Permite cargar del formulario de estudiante a un objeto tipo estudiante. 

	   Valor de retorno:
	     Objeto estudiante con todos los campos del formulario 
	*/
	public static function cargardeFormulario(){

		$estudiante = new Estudiante();	

		$estudiante->asignarCedula(				PostGet::obtenerPostGet('cedula')			);
		$estudiante->asignarCodigo(				PostGet::obtenerPostGet('codigo')			);
		$estudiante->asignarRif(				PostGet::obtenerPostGet('rif')				);
		$estudiante->asignarCodPensum(			PostGet::obtenerPostGet('codPensum')		);
		$estudiante->asignarCodInstituto(		PostGet::obtenerPostGet('codInstituto')		);
		$estudiante->asignarNombre1(			PostGet::obtenerPostGet('nombre1')			);
		$estudiante->asignarNombre2(			PostGet::obtenerPostGet('nombre2')			);
		$estudiante->asignarApellido1(			PostGet::obtenerPostGet('apellido1')		);
		$estudiante->asignarApellido2(			PostGet::obtenerPostGet('apellido2')		);
		$estudiante->asignarSexo(				PostGet::obtenerPostGet('sexo')				);
		$estudiante->asignarFecNacimiento(		PostGet::obtenerPostGet('fecNacimiento')	);
		$estudiante->asignarTipSangre(			PostGet::obtenerPostGet('tipSangre')		);
		$estudiante->asignarTelefono1(			PostGet::obtenerPostGet('telefono1')		);
		$estudiante->asignarTelefono2(			PostGet::obtenerPostGet('telefono2')		);
		$estudiante->asignarCorreoPersonal(		PostGet::obtenerPostGet('correoPersonal')	);
		$estudiante->asignarCorreoInstitucional(PostGet::obtenerPostGet('correoInstitucional'));	
		$estudiante->asignarDireccion(			PostGet::obtenerPostGet('direccion')		);
		$estudiante->asignarNumEmpleado(		PostGet::obtenerPostGet('numCarnet')		);
		$estudiante->asignarNumCarnet(			PostGet::obtenerPostGet('noCarnet')			);
		$estudiante->asignarNumExpediente(		PostGet::obtenerPostGet('numExpediente')	);
		$estudiante->asignarLogin(				PostGet::obtenerPostGet('login')			);
		$estudiante->asignarCodRusnies(			PostGet::obtenerPostGet('codRusnies')		);
		$estudiante->asignarEstado(				PostGet::obtenerPostGet('estado')			);
	
		return $estudiante;
	}

	public static function modificarEstudiante() {		
		global $gbVista;
		
		//construir el objeto estudiante proveniente desde la vista
		$estudiante = self::cargardeFormulario();

		//asigna la información a la vista para comunicarse con el usuario
		$gbVista->asignarDato('estudiante', $estudiante);

		//titulo predeterminado para modificar
		$gbVista->asignarDato('titulo','Modificar Estudiante');

		//Si algún dato no dublicable del objeto ya existe en la base de datos
		//devuelve true
		$error= self::validarDuplicaciones($estudiante);
		
		if($error==false){
			//procede a modificar el estudiante en la tabla persona
			$respuestaP = PersonaServicio::ModificarPersona($estudiante);
			if ($respuestaP){
					//procede a modificar el objeto en la tabla estudiante
					$respuesta = EstudianteServicio::modificarEstudiante($estudiante);

					//procesar respuesta		
					$gbVista->asignarDato('accion',PostGet::obtenerPostGet('m_accion'));

					if ($respuesta === true) { //caso de exito
						$fotografia= $this->obtenerSubControlador('fotografia')->manejarRequerimiento();
						
						$gbVista->asignarDato('mensaje','Estudiante modificado con éxito');
						$gbVista->asignarDato('exito',true);
					}else{
						$gbVista->asignarDato('exito',false);  
						$gbVista->asignarDato('mensaje','No se pudo modificar el estudiante '. $estudiante->obtenerNombre1() .'. (ha sido modificar solo en la tabla "persona"). error desconocido');
					}
				}else{
				//asigna el mensaje a mostrar según el error
				$gbVista->asignarDato('exito',false);
				//asigna el mismo estudiante como información para que permanezca
				//la información en pantalla
				$gbVista->asignarDato('mensaje','No se pudo modificar el estudiante '. $estudiante->obtenerNombre1() .'. error desconocido');
			}
		}else{
			//asigna el mensaje a mostrar según el error
			$gbVista->asignarDato('exito',false);
			//asigna el mismo estudiante como información para que permanezca
		}
		//asigna la vista encargada de mostrar la data
		$gbVista->asignarVista("EstudianteMensaje");

		//muestra la vista
		$gbVista->mostrar();
	}
	
	public static function eliminarEstudiante() {		
		global $gbVista;
		
		//Obtener el código del instituto a eliminar
		$codigo = PostGet::obtenerPostGet('codigo');
		$submodulo = PostGet::obtenerPostGet('submodulo');

		$gbVista->asignarDato('titulo','Eliminar Estudiante');

		//$fotografia= selefobtenerSubControlador('fotografia')->manejarRequerimiento();

		//~ $codcursos = EstCursoServicio::obtenerCurEstudiantePorCodEstudiante($codigo);
		//~ if($codcursos == FALSE){
			$respuesta = EstudianteServicio::eliminarEstudiante($codigo);
			if($respuesta){
				//procesar respuesta		
				$respuestaP = PersonaServicio::eliminarPersona($codigo);
				
				if ($respuesta == true){  //caso de exito
					$gbVista->asignarDato('mensaje','Estudiante eliminado con éxito');
					$gbVista->asignarDato('exito',true);
				}else{
					$gbVista->asignarDato('mensaje','Error al eliminar el estudiante de la tabla persona. (FUE ELIMINADO DE LA TABLA ESTUDIANTE)');
					$gbVista->asignarDato('exito',false);
				}
			}else{
				$gbVista->asignarDato('mensaje','Error desconocido al eliminar el estudiante.');
				$gbVista->asignarDato('exito',false);
			}
		//~ }else{
			//~ $gbVista->asignarDato('mensaje','Error al eliminar el estudiante. El estudiante tiene cursos asignados.');
			//~ $gbVista->asignarDato('exito',false);
		
		//asignar la vista para mostrar mensajes, y mostrarla
		$gbVista->asignarVista("EstudianteMensaje");
		$gbVista->mostrar();
		
	}

	

	//busca una cedula existente en la tabla 
	public static function validarCedula($cedula, $codigo=NULL){
		$existe = PersonaServicio::obtenerPersonaPorCedula($cedula);
		
		if(($existe) AND ($codigo != $existe[0]->obtenerCodigo())) return $existe[0]->obtenerCedula(); 
		else return false;
	}

	//busca un carnet existente en la tabla 
	public static function validarNumCarnet($numCarnet, $codigo=NULL){
		$existe = EstudianteServicio::obtenerEstudiantePorNumCarnet($numCarnet);
//		var_dump($codigo, $existe[0]->obtenerCodigo());
//		die();
		if(($existe)	AND ($codigo != $existe[0]->obtenerCodigo())){
			return $existe[0]->obtenerNumCarnet();
		}
		else return false;
	}

	//busca un carnet existente en la tabla 
	public static function validarLogin($login, $codigo=NULL){
		$existe = EstudianteServicio::obtenerEstudiantePorLogin($login);
		if(($existe)	AND ($codigo != $existe[0]->obtenerCodigo())) return $existe[0]->obtenerLogin(); 
		else return false;
	}

	//busca un numExpediente existente en la tabla 
	public static function validarNumExpediente($numExpediente, $codigo=NULL){
		$existe = EstudianteServicio::obtenerEstudiantePorNumExpediente($numExpediente);
		if(($existe)	AND ($codigo != $existe[0]->obtenerCodigo())) return $existe[0]->obtenerNumExpediente(); 
		else return false;
	}

	//busca un codRusnies existente en la tabla 
	public static function validarCodRusnies($codRusnies, $codigo=NULL){
		$existe = EstudianteServicio::obtenerEstudiantePorCodRusnies($codRusnies);
		if(($existe)	AND ($codigo != $existe[0]->obtenerCodigo())) return $existe[0]->obtenerCodRusnies(); 
		else return false;
	}

	//busca un Rif existente en la tabla 
	public static function validarRif($rif, $codigo=NULL){
		$existe = PersonaServicio::obtenerPersonaPorRif($rif);
		if(($existe)	AND ($codigo != $existe[0]->obtenerCodigo())) return $existe[0]->obtenerRif(); 
		else return false;
	}

	//asignar y obtener de todos los atributos   
	public static function asignarSubControlador($indice, $subControlador){
		$subControlador[$indice] = $subControlador;
	}

	//Retorna el subcontrolador ubicada en la posición $indice,  
	//de no existir retorna FALSE
	public function obtenerSubControlador($indice){
		return isset($this->subControlador[$indice])  ?  $this->subControlador[$indice] : FALSE;
	}
}
?>
